﻿//    nVLC
//    
//    Author:  Roman Ginzburg
//
//    nVLC is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    nVLC is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//    GNU General Public License for more details.
//     
// ========================================================================

using System;
using Declarations.Events;
using Implementation.Media;
using LibVlcWrapper;

namespace Implementation.Events
{
   class MediaListPlayerEventManager : EventManager, IMediaListPlayerEvents
   {
      public MediaListPlayerEventManager(IEventProvider eventProvider)
         : base(eventProvider)
      {
 
      }

      protected override void MediaPlayerEventOccured(ref libvlc_event_t libvlc_event, IntPtr userData)
      {
         switch (libvlc_event.type)
         {
            case libvlc_event_e.libvlc_MediaListPlayerPlayed:
               if (m_mediaListPlayerPlayed != null)
               {
                  m_mediaListPlayerPlayed(m_eventProvider, EventArgs.Empty);
               }
               break;
            case libvlc_event_e.libvlc_MediaListPlayerNextItemSet:
               if (m_mediaListPlayerNextItemSet != null)
               {
                  BasicMedia media = new BasicMedia(libvlc_event.media_list_player_next_item_set.item, ReferenceCountAction.AddRef);
                  m_mediaListPlayerNextItemSet(m_eventProvider, new MediaListPlayerNextItemSet(media));
                  media.Release();
               }
               break;
            case libvlc_event_e.libvlc_MediaListPlayerStopped:
               if(m_mediaListPlayerStopped != null)
               {
                  m_mediaListPlayerStopped(m_eventProvider, EventArgs.Empty);
               }
               break;
         }
      }

      #region IMediaListPlayerEvents Members

      event EventHandler m_mediaListPlayerPlayed;
      public event EventHandler MediaListPlayerPlayed
      {
         add
         {
            if (m_mediaListPlayerPlayed == null)
            {
               Attach(libvlc_event_e.libvlc_MediaListPlayerPlayed);
            }
            m_mediaListPlayerPlayed += value;
         }
         remove
         {
            if (m_mediaListPlayerPlayed != null)
            {
               m_mediaListPlayerPlayed -= value;
               if (m_mediaListPlayerPlayed == null)
               {
                  Dettach(libvlc_event_e.libvlc_MediaListPlayerPlayed);
               }
            }
         }
      }

      event EventHandler<MediaListPlayerNextItemSet> m_mediaListPlayerNextItemSet;
      public event EventHandler<MediaListPlayerNextItemSet> MediaListPlayerNextItemSet
      {
         add
         {
            if (m_mediaListPlayerNextItemSet == null)
            {
               Attach(libvlc_event_e.libvlc_MediaListPlayerNextItemSet);
            }
            m_mediaListPlayerNextItemSet += value;
         }
         remove
         {
            if (m_mediaListPlayerNextItemSet != null)
            {
               m_mediaListPlayerNextItemSet -= value;
               if (m_mediaListPlayerNextItemSet == null)
               {
                  Dettach(libvlc_event_e.libvlc_MediaListPlayerNextItemSet);
               }
            }
         }
      }

      event EventHandler m_mediaListPlayerStopped;
      public event EventHandler MediaListPlayerStopped
      {
         add
         {
            if (m_mediaListPlayerStopped == null)
            {
               Attach(libvlc_event_e.libvlc_MediaListPlayerStopped);
            }
            m_mediaListPlayerStopped += value;
         }
         remove
         {
            if (m_mediaListPlayerStopped != null)
            {
               m_mediaListPlayerStopped -= value;
               if (m_mediaListPlayerStopped == null)
               {
                  Dettach(libvlc_event_e.libvlc_MediaListPlayerStopped);
               }
            }
         }
      }

      #endregion
   }
}
